package org.example.onlinejudge.service;

import org.example.onlinejudge.model.Permission;
import org.example.onlinejudge.repository.PermissionRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Optional;

/**
 * 权限服务类
 * 负责处理权限相关的业务逻辑
 */
@Service
public class PermissionService {

    @Autowired
    private PermissionRepository permissionRepository;

    /**
     * 查找所有权限
     */
    public List<Permission> findAllPermissions() {
        return permissionRepository.findAll();
    }

    /**
     * 根据ID查找权限
     */
    public Optional<Permission> findById(Long id) {
        return permissionRepository.findById(id);
    }

    /**
     * 根据权限代码查找权限
     */
    public Optional<Permission> findByPermCode(String permCode) {
        return permissionRepository.findByPermCode(permCode);
    }

    /**
     * 创建新权限
     */
    @Transactional
    public Permission createPermission(String permCode, String permName) {
        // 检查权限代码是否已存在
        if (permissionRepository.existsByPermCode(permCode)) {
            throw new RuntimeException("权限代码已存在: " + permCode);
        }

        Permission permission = new Permission();
        permission.setPermCode(permCode);
        permission.setPermName(permName);
        return permissionRepository.save(permission);
    }

    /**
     * 更新权限信息
     */
    @Transactional
    public Permission updatePermission(Long id, String permCode, String permName) {
        Permission permission = permissionRepository.findById(id)
                .orElseThrow(() -> new RuntimeException("权限不存在"));
        
        // 如果修改了权限代码，检查新代码是否已存在
        if (!permission.getPermCode().equals(permCode)) {
            if (permissionRepository.existsByPermCode(permCode)) {
                throw new RuntimeException("权限代码已存在: " + permCode);
            }
            permission.setPermCode(permCode);
        }
        
        permission.setPermName(permName);
        return permissionRepository.save(permission);
    }

    /**
     * 删除权限
     */
    @Transactional
    public void deletePermission(Long id) {
        Permission permission = permissionRepository.findById(id)
                .orElseThrow(() -> new RuntimeException("权限不存在"));
        
        // 检查是否有角色正在使用此权限
        if (!permission.getRoles().isEmpty()) {
            throw new RuntimeException("该权限正在被 " + permission.getRoles().size() + " 个角色使用，无法删除");
        }
        
        permissionRepository.deleteById(id);
    }

    /**
     * 检查权限代码是否存在
     */
    public boolean existsByPermCode(String permCode) {
        return permissionRepository.existsByPermCode(permCode);
    }
}
